﻿'Imports System
'Imports System.Collections
'Imports System.ComponentModel
'Imports System.Drawing
'Imports System.Windows.Forms
'Imports Microsoft.DirectX.DirectSound
'Imports System.Threading
'Imports System.Collections.Specialized
'Public Class Sound_Card_Form
'    Private Sub StartButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles FindButton.Click
'        'Dim MyVU As New VolumeMeter
'        'MyVU.Start()
'        Start()
'    End Sub
'    Private Sub FindButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles FindButton.Click
'        'Dim MyVU As New VolumeMeter
'        'MyVU.FindDevices()
'        FindDevices()
'    End Sub

'    ' Public Class VolumeMeter
'    'Inherits System.Windows.Forms.UserControl
'    'Public Delegate Sub VolumeChangedEventHandler(ByVal vcea As VolumeChangedEventArgs)
'    'Public Event VolumeChanged As VolumeChangedEventHandler
'    Private Const SAMPLES As Integer = 8
'    Private Shared SAMPLE_FORMAT_ARRAY As Integer() = {SAMPLES, 2, 1}
'    Public Shared audioDevices As CaptureDevicesCollection
'    Private Shared m_deviceNames As StringCollection
'    Private deviceName As String = "(none)"
'    Private deviceIndex As Integer = -1
'    Private buffer As Microsoft.DirectX.DirectSound.CaptureBuffer
'    Private liveVolumeThread As System.Threading.Thread
'    Private m_sampleDelay As Integer = 100
'    Private m_frameDelay As Integer = 10
'    Private m_autoStart As Boolean = True
'    'Private components As System.ComponentModel.Container = Nothing
'    Public Sub FindDevices()
'        Dim audioDevices As New CaptureDevicesCollection
'        Dim x As Integer = 0
'        While x < audioDevices.Count
'            ComboBox1.Items.Add(audioDevices.Item(x).Description)
'            x = x + 1
'        End While
'        ComboBox1.SelectedIndex = 0
'    End Sub
'    Public Sub Start()
'        [Stop]()
'        Dim audioDevices As New CaptureDevicesCollection
'        deviceIndex = ComboBox1.SelectedIndex
'        If deviceIndex <> -1 Then
'            ' initialize the capture buffer and start the animation thread
'            Dim cap As New Capture(audioDevices(deviceIndex).DriverGuid)
'            Dim desc As New CaptureBufferDescription()
'            Dim wf As New WaveFormat()
'            wf.BitsPerSample = 16
'            wf.SamplesPerSecond = 44100
'            wf.Channels = 2
'            wf.BlockAlign = CShort(wf.Channels * wf.BitsPerSample / 8)
'            wf.AverageBytesPerSecond = wf.BlockAlign * wf.SamplesPerSecond
'            wf.FormatTag = WaveFormatTag.Pcm
'            desc.Format = wf
'            desc.BufferBytes = SAMPLES * wf.BlockAlign
'            buffer = New Microsoft.DirectX.DirectSound.CaptureBuffer(desc, cap)
'            buffer.Start(True)
'            ' Start a seperate thread to read the buffer and update the progress bars
'            liveVolumeThread = New Thread(AddressOf updateProgress) 'Thread starts at updateProgress
'            Control.CheckForIllegalCrossThreadCalls = False ' This is needed otherwise the form will not update
'            liveVolumeThread.Priority = ThreadPriority.Lowest ' Thread works in the background
'            liveVolumeThread.Start()
'        End If
'    End Sub
'    Public Sub [Stop]()
'        If liveVolumeThread IsNot Nothing Then
'            liveVolumeThread.Abort()
'            liveVolumeThread.Join()
'            liveVolumeThread = Nothing
'        End If
'        If buffer IsNot Nothing Then
'            If buffer.Capturing Then
'                buffer.[Stop]()
'            End If
'            buffer.Dispose()
'            buffer = Nothing
'        End If
'    End Sub

'    Public Sub updateProgress()
'        While True
'            Dim tempFrameDelay As Integer = m_frameDelay
'            Dim tempSampleDelay As Integer = m_sampleDelay
'            Dim samples__1 As Array = buffer.Read(0, GetType(Int16), LockFlag.FromWriteCursor, SAMPLE_FORMAT_ARRAY)
'            ' for each channel, determine the step size necessary for each iteration
'            Dim leftGoal As Integer = 0
'            Dim rightGoal As Integer = 0
'            ' Sum the 8 samples
'            For i As Integer = 0 To SAMPLES - 1
'                leftGoal += CType(samples__1.GetValue(i, 0, 0), Int16)
'                rightGoal += CType(samples__1.GetValue(i, 1, 0), Int16)
'            Next
'            ' Calculate the average of the 8 samples
'            leftGoal = CInt(Math.Abs(leftGoal \ SAMPLES))
'            rightGoal = CInt(Math.Abs(rightGoal \ SAMPLES))
'            Dim range1 As Double = leftGoal - ProgressBar1.Value ' calculates the difference between new and the current progress bar value
'            Dim range2 As Double = rightGoal - ProgressBar2.Value
'            ' Assign the exact current value to the progress bar
'            Dim exactValue1 As Double = ProgressBar1.Value
'            Dim exactValue2 As Double = ProgressBar2.Value
'            Dim stepSize1 As Double = range1 / tempSampleDelay * tempFrameDelay
'            ' Limit the value range to positive values
'            If Math.Abs(stepSize1) < 0.01 Then
'                stepSize1 = Math.Sign(range1) * 0.01
'            End If
'            Dim absStepSize1 As Double = Math.Abs(stepSize1)
'            Dim stepSize2 As Double = range2 / tempSampleDelay * tempFrameDelay
'            If Math.Abs(stepSize2) < 0.01 Then
'                stepSize2 = Math.Sign(range2) * 0.01
'            End If
'            Dim absStepSize2 As Double = Math.Abs(stepSize2)
'            ' increment/decrement the bars' values until both equal their desired goals,
'            ' sleeping between iterations
'            If (ProgressBar1.Value = leftGoal) AndAlso (ProgressBar2.Value = rightGoal) Then
'                Thread.Sleep(tempSampleDelay)
'            Else
'                Do
'                    If ProgressBar1.Value <> leftGoal Then
'                        If absStepSize1 < Math.Abs(leftGoal - ProgressBar1.Value) Then
'                            exactValue1 += stepSize1
'                            ProgressBar1.Value = CInt(Math.Truncate(Math.Round(exactValue1)))
'                            'This is the real value
'                            'decibels = 20 * Log10(ProgressBar1.Value/ 32768.0)
'                        Else
'                            ProgressBar1.Value = leftGoal
'                        End If
'                    End If
'                    If ProgressBar2.Value <> rightGoal Then
'                        If absStepSize2 < Math.Abs(rightGoal - ProgressBar2.Value) Then
'                            exactValue2 += stepSize2
'                            ProgressBar2.Value = CInt(Math.Truncate(Math.Round(exactValue2)))
'                        Else
'                            ProgressBar2.Value = rightGoal
'                        End If
'                    End If
'                    Thread.Sleep(tempFrameDelay)
'                Loop While (ProgressBar1.Value <> leftGoal) OrElse (ProgressBar2.Value <> rightGoal)
'            End If
'        End While
'    End Sub

'End Class